package com.herench.bunch.emr.convert;

import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.model.v24.datatype.CE;
import ca.uhn.hl7v2.model.v24.group.ADT_A01_INSURANCE;
import ca.uhn.hl7v2.model.v24.group.RTB_K13_ROW_DEFINITION;
import ca.uhn.hl7v2.model.v24.message.ADT_A01;
import ca.uhn.hl7v2.model.v24.message.QBP_Q11;
import ca.uhn.hl7v2.model.v24.message.QRY_Q01;
import ca.uhn.hl7v2.model.v24.message.RTB_K13;
import ca.uhn.hl7v2.model.v24.segment.*;
import ca.uhn.hl7v2.parser.DefaultModelClassFactory;
import com.herench.bunch.commons.support.RequestMessage;
import com.herench.bunch.commons.utils.IdGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class PatientBaseInfoConvert extends AbstractMessageConvert {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public Map<String, Object> doToMessage(RequestMessage requestMessage) throws Exception {
        Map<String, Object> params = new HashMap<>();
        QRY_Q01 hl7Message = (QRY_Q01) requestMessage.getHl7Message();
        QRD qrd = hl7Message.getQRD();
        String patientId = qrd.getQrd4_QueryID().getValue();
        params.put("patientId", patientId);
        return params;
    }

    @Override
    @SuppressWarnings("unchecked")
    public Message fromMessage(Object message) throws Exception {
        Assert.notNull(message, "message 为空.");
        List<Map<String, Object>> res = (List<Map<String, Object>>) message;
        ADT_A01 adtA01 = new ADT_A01();
        adtA01.initQuickstart("ADT_A01", "ADT_A01", "A");
        MSH msh = adtA01.getMSH();
        initResponseMessageMSH(msh);
        Map<String, Object> reqMap = res.get(0);
        PID pid = adtA01.getPID();
        PV1 pv1 = adtA01.getPV1();
        PV2 pv2 = adtA01.getPV2();
        ROL rol = adtA01.getROL();
        ADT_A01_INSURANCE insurance = adtA01.getINSURANCE();
        NK1 nk1 = adtA01.getNK1();

        pid.getPid2_PatientID().getCx1_ID().setValue(String.valueOf(reqMap.get("patientId")));
        pid.getPid16_MaritalStatus().getCe2_Text().setValue(String.valueOf(reqMap.get("maritalStatus")));
        pid.getPid11_PatientAddress(0).getXad1_StreetAddress().getSad1_StreetOrMailingAddress().setValue(String.valueOf(reqMap.get("mailingAddress")));
        pid.getPid11_PatientAddress(0).getXad5_ZipOrPostalCode().setValue(String.valueOf(reqMap.get("zipCode")));
        pid.getPid2_PatientID().getCx5_IdentifierTypeCode().setValue(String.valueOf(reqMap.get("babyFlag")));
        pid.getPid1_SetIDPID().setValue(String.valueOf(reqMap.get("inpNo")));
        pid.getPid11_PatientAddress(0).getXad9_CountyParishCode().setValue(String.valueOf(reqMap.get("inSource")));
        pid.getPid13_PhoneNumberHome(0).getXtn1_9999999X99999CAnyText().setValue(String.valueOf(reqMap.get("homeTel")));
        pid.getPid11_PatientAddress(0).getXad1_StreetAddress().getSad2_StreetName().setValue(String.valueOf(reqMap.get("nomen")));
        pid.getPid2_PatientID().getCx2_CheckDigit().setValue(String.valueOf(reqMap.get("inpatientNo")));
        pid.getPid3_PatientIdentifierList(0).getCx2_CheckDigit().setValue(String.valueOf(reqMap.get("age")));
        pid.getPid5_PatientName(0).getXpn2_GivenName().setValue(String.valueOf(reqMap.get("name")));
        pid.getPid5_PatientName(0).getXpn8_NameRepresentationCode().setValue(String.valueOf(reqMap.get("namePhonetic")));
        pid.getPid8_AdministrativeSex().setValue(String.valueOf(reqMap.get("sex")));
        pid.getPid7_DateTimeOfBirth().getTs1_TimeOfAnEvent().setValue(String.valueOf(reqMap.get("dateOfBirth")));
        pid.getPid23_BirthPlace().setValue(String.valueOf(reqMap.get("birthPlace")));
        pid.getPid28_Nationality().getCe2_Text().setValue(String.valueOf(reqMap.get("citizenship")));
        pid.getPid10_Race(0).getCe2_Text().setValue(String.valueOf(reqMap.get("nation")));
        pid.getPid19_SSNNumberPatient().setValue(String.valueOf(reqMap.get("idNo")));
        pid.getPid11_PatientAddress(0).getXad3_City().setValue(String.valueOf(reqMap.get("jiguan")));

        pv1.getPv11_SetIDPV1().setValue(String.valueOf(reqMap.get("visitId")));
        pv1.getPv13_AssignedPatientLocation().getPl1_PointOfCare().setValue(String.valueOf(reqMap.get("deptAdmissionTo")));
        pv1.getPv144_AdmitDateTime().getTimeOfAnEvent().setValue(String.valueOf(reqMap.get("admissionDateTime")));
        pv1.getPv151_VisitIndicator().setValue(String.valueOf(reqMap.get("deptDischargeFrom")));
        pv1.getPv13_AssignedPatientLocation().getPl2_Room().setValue(String.valueOf(reqMap.get("wardAdmissionTo")));
        pv1.getPv137_DischargedToLocation().getDld1_DischargeLocation().setValue(String.valueOf(reqMap.get("wardDischargeFrom")));
        pv1.getPv145_DischargeDateTime(1).getTs1_TimeOfAnEvent().setValue(String.valueOf(reqMap.get("dischargeDateTime")));
        pv1.getPv118_PatientType().setValue(String.valueOf(reqMap.get("chargeType")));
        pv1.getPv12_PatientClass().setValue(String.valueOf(reqMap.get("patientClass")));
        pv1.getPv115_AmbulatoryStatus(0).setValue(String.valueOf(reqMap.get("patAdmCondition")));
        pv1.getPv117_AdmittingDoctor(0).getXcn3_GivenName().setValue(String.valueOf(reqMap.get("admittedBy")));
        pv1.getPv136_DischargeDisposition().setValue(String.valueOf(reqMap.get("dischargeDisposition")));
        pv1.getPv147_TotalCharges().setValue(String.valueOf(reqMap.get("totalCosts")));
        pv1.getPv149_TotalPayments().setValue(String.valueOf(reqMap.get("totalPayments")));
        pv1.getPv13_AssignedPatientLocation().getPl3_Bed().setValue(String.valueOf(reqMap.get("bedLabel")));
        pv1.getPv13_AssignedPatientLocation().getPl7_Building().setValue(String.valueOf(reqMap.get("bedNo")));
        pv1.getPv13_AssignedPatientLocation().getPl8_Floor().setValue(String.valueOf(reqMap.get("bedAdmissionTo")));
        pv1.getPv13_AssignedPatientLocation().getPl9_LocationDescription().setValue(String.valueOf(reqMap.get("bedDischargeFrom")));
        pv1.getPv122_CourtesyCode().setValue(String.valueOf(reqMap.get("mrDoctorPartStatus")));
        pv1.getPv124_ContractCode(0).setValue(String.valueOf(reqMap.get("mrNursePartStatus")));
        pv1.getPv130_TransferToBadDebtDate().setValue(String.valueOf(reqMap.get("wardDateTime")));
        pv1.getPv125_ContractEffectiveDate(0).setValue(String.valueOf(reqMap.get("admWardDateTime")));

        pv2.getPv21_PriorPendingLocation().getPl2_Room().setValue(String.valueOf(reqMap.get("wardCode")));
        pv2.getPv21_PriorPendingLocation().getPl1_PointOfCare().setValue(String.valueOf(reqMap.get("deptCode")));
        pv2.getPv242_PatientConditionCode().getCe2_Text().setValue(String.valueOf(reqMap.get("patientCondition")));

        rol.getRol3_RoleROL().getCe2_Text().setValue(String.valueOf(reqMap.get("occupation")));
        rol.getRol3_RoleROL().getCe4_AlternateIdentifier().setValue(String.valueOf(reqMap.get("workingStatus")));
        rol.getRol11_OfficeHomeAddress(0).getXad1_StreetAddress().getSad1_StreetOrMailingAddress().setValue(String.valueOf(reqMap.get("serviceAgency")));
        rol.getRol12_Phone(0).getXtn1_9999999X99999CAnyText().setValue(String.valueOf(reqMap.get("workTel")));
        rol.getRol11_OfficeHomeAddress(0).getXad5_ZipOrPostalCode().setValue(String.valueOf(reqMap.get("workZip")));

        insurance.getIN1().getSetIDIN1().setValue(String.valueOf(reqMap.get("insuranceType")));
        insurance.getIN1().getIn115_PlanType().setValue(String.valueOf(reqMap.get("insuranceNo")));

        nk1.getNk12_NKName(0).getXpn2_GivenName().setValue(String.valueOf(reqMap.get("nextOfKin")));
        nk1.getNk13_Relationship().getCe2_Text().setValue(String.valueOf(reqMap.get("relationship")));
        nk1.getNk14_Address(0).getXad1_StreetAddress().getSad1_StreetOrMailingAddress().setValue(String.valueOf(reqMap.get("nextOfKinAddr")));
        nk1.getNk14_Address(0).getXad5_ZipOrPostalCode().setValue(String.valueOf(reqMap.get("nextOfKinZipcode")));
        nk1.getNk15_PhoneNumber(0).getXtn1_9999999X99999CAnyText().setValue(String.valueOf(reqMap.get("nextOfKinPhone")));

        return adtA01;


//        Assert.notNull(message, "message 为空.");
//        List<Map<String, Object>> res = (List<Map<String, Object>> ) message;
//        RTB_K13 rtbK13 = new RTB_K13();
//        rtbK13.initQuickstart("RTB_K13", "RTB_K13", "P");
//        MSH msh = rtbK13.getMSH();
//        initResponseMessageMSH(msh);
//
//        RTB_K13_ROW_DEFINITION definition = rtbK13.getROW_DEFINITION();
//        int index = 0;
//        for (Map<String,Object> resMap : res) {
//            RDT rdt = new RDT(rtbK13, new DefaultModelClassFactory());
//            CE ce = new CE(rtbK13);
//            ce.getCe1_Identifier().setValue("RD");
//            StringBuffer buffer = new StringBuffer();
//            buffer.append("patientId=").append(resMap.get("patientId")).append("#")
//                    .append("visitId=").append(resMap.get("visitId")).append("#")
//                    .append("deptAdmissionTo=").append(resMap.get("deptAdmissionTo")).append("#")
//                    .append("admissionDateTime=").append(resMap.get("admissionDateTime")).append("#")
//                    .append("deptDischargeFrom=").append(resMap.get("deptDischargeFrom")).append("#")
//                    .append("wardAdmissionTo=").append(resMap.get("wardAdmissionTo")).append("#")
//                    .append("wardDischargeFrom=").append(resMap.get("wardDischargeFrom")).append("#")
//                    .append("dischargeDateTime=").append(resMap.get("dischargeDateTime")).append("#")
//                    .append("occupation=").append(resMap.get("occupation")).append("#")
//                    .append("maritalStatus=").append(resMap.get("maritalStatus")).append("#")
//                    .append("chargeType=").append(resMap.get("chargeType")).append("#")
//                    .append("workingStatus=").append(resMap.get("workingStatus")).append("#")
//                    .append("insuranceType=").append(resMap.get("insuranceType")).append("#")
//                    .append("insuranceNo=").append(resMap.get("insuranceNo")).append("#")
//                    .append("serviceAgency=").append(resMap.get("serviceAgency")).append("#")
//                    .append("mailingAddress=").append(resMap.get("mailingAddress")).append("#")
//                    .append("zipCode=").append(resMap.get("zipCode")).append("#")
//                    .append("nextOfKin=").append(resMap.get("nextOfKin")).append("#")
//                    .append("relationship=").append(resMap.get("relationship")).append("#")
//                    .append("nextOfKinAddr=").append(resMap.get("nextOfKinAddr")).append("#")
//                    .append("nextOfKinZipcode=").append(resMap.get("nextOfKinZipcode")).append("#")
//                    .append("nextOfKinPhone=").append(resMap.get("nextOfKinPhone")).append("#")
//                    .append("patientClass=").append(resMap.get("patientClass")).append("#")
//                    .append("patAdmCondition=").append(resMap.get("patAdmCondition")).append("#")
//                    .append("admittedBy=").append(resMap.get("admittedBy")).append("#")
//                    .append("dischargeDisposition=").append(resMap.get("dischargeDisposition")).append("#")
//                    .append("totalCosts=").append(resMap.get("totalCosts")).append("#")
//                    .append("totalPayments=").append(resMap.get("totalPayments")).append("#")
//                    .append("bedLabel=").append(resMap.get("bedLabel")).append("#")
//                    .append("bedNo=").append(resMap.get("bedNo")).append("#")
//                    .append("bedAdmissionTo=").append(resMap.get("bedAdmissionTo")).append("#")
//                    .append("bedDischargeFrom=").append(resMap.get("bedDischargeFrom")).append("#")
//                    .append("mrDoctorPartStatus=").append(resMap.get("mrDoctorPartStatus")).append("#")
//                    .append("mrNursePartStatus=").append(resMap.get("mrNursePartStatus")).append("#")
//                    .append("babyFlag=").append(resMap.get("babyFlag")).append("#")
//                    .append("inpNo=").append(resMap.get("inpNo")).append("#")
//                    .append("wardDateTime=").append(resMap.get("wardDateTime")).append("#")
//                    .append("inSource=").append(resMap.get("inSource")).append("#")
//                    .append("homeTel=").append(resMap.get("homeTel")).append("#")
//                    .append("nomen=").append(resMap.get("nomen")).append("#")
//                    .append("workTel=").append(resMap.get("workTel")).append("#")
//                    .append("workZip=").append(resMap.get("workZip")).append("#")
//                    .append("inpatientNo=").append(resMap.get("inpatientNo")).append("#")
//                    .append("age=").append(resMap.get("age")).append("#")
//                    .append("name=").append(resMap.get("name")).append("#")
//                    .append("namePhonetic=").append(resMap.get("namePhonetic")).append("#")
//                    .append("sex=").append(resMap.get("sex")).append("#")
//                    .append("dateOfBirth=").append(resMap.get("dateOfBirth")).append("#")
//                    .append("birthPlace=").append(resMap.get("birthPlace")).append("#")
//                    .append("citizenship=").append(resMap.get("citizenship")).append("#")
//                    .append("nation=").append(resMap.get("nation")).append("#")
//                    .append("idNo=").append(resMap.get("idNo")).append("#")
//                    .append("wardCode=").append(resMap.get("wardCode")).append("#")
//                    .append("deptCode=").append(resMap.get("deptCode")).append("#")
//                    .append("admWardDateTime=").append(resMap.get("admWardDateTime")).append("#")
//                    .append("jiguan=").append(resMap.get("jiguan")).append("#")
//                    .append("patientCondition=").append(resMap.get("patientCondition")).append("#");
//            ce.getCe2_Text().setValue(buffer.toString());
//            rdt.getColumnValue().setData(ce);
//            definition.insertRDT(rdt, index++);
//        }
//        return rtbK13;
    }

    @Override
    public Message generatorReqMessage() throws Exception {
        QBP_Q11 qbp = new QBP_Q11();
        qbp.initQuickstart("QBP_Q11", "Q11", "L");
        MSH msh = qbp.getMSH();
        msh.getMsh3_SendingApplication().getHd1_NamespaceID().setValue("SSM");
        msh.getMessageControlID().setValue(IdGenerator.getUUID());
        msh.getMsh11_ProcessingID().getPt1_ProcessingID().setValue("200140");
        msh.getMsh11_ProcessingID().getProcessingMode().setValue("QR");
        QPD qpd = qbp.getQPD();
        qpd.getMessageQueryName().getIdentifier().setValue("查询号别");
        qpd.getQpd2_QueryTag().setValue("QR");
        return qbp;
    }
}
